#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT 1234
#define MAXDATASIZE 100

void process(FILE* fp, int sockfd);

char* getMessage(char* sendline, int len, FILE* fp);

int main(int argc, char** argv){
    int sockfd;
    struct hostent* he;
    struct sockaddr_in server;

    // 通过命令行参数获得目的IP地址
    if(argc != 2){
        printf("Usage: %s <IP Address>\n", argv[0]);
        exit(1);
    }

    if((he = gethostbyname(argv[1])) == NULL){
        printf("gethostbyname error");
        exit(1);
    }

    // 建立套接字
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        printf("socket error");
        exit(1);
    }

    // 将IP地址填充至地址结构当中
    bzero(&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr = *((struct in_addr*)he->h_addr);

    // 与目标地址的地址结构建立连接
    if(connect(sockfd, (struct sockaddr*) &server, sizeof(server)) == -1){
        printf("connect error.\n");
        exit(1);
    }

    // 处理
    process(stdin, sockfd);

    close(sockfd);

    return 0;
    
}

void process(FILE* fp, int sockfd){
    char sendline[MAXDATASIZE], recvline[MAXDATASIZE];
    int num;
    printf("connected to server.\n");
    printf("Input clinet's name: ");
    // 从标准输入获得的数据传递给字节缓冲区,输入名字
    if (fgets(sendline, MAXDATASIZE, fp) == NULL){
        printf("\nExit\n");
        return;
    }

    // 将字节缓冲区中的数据进行发送,将名字发送
    send(sockfd, sendline, strlen(sendline), 0);
    // 从标准输入获得的数据传递给字节缓冲区,直至终止进程
    while(getMessage(sendline, MAXDATASIZE, fp) != NULL){
        // 将字节缓冲区中的数据进行发送
        send(sockfd, sendline, strlen(sendline), 0);
        // 接收由服务端发回的数据,缓存至字节缓冲区,并打印至终端
        if((num = recv(sockfd, recvline, MAXDATASIZE, 0)) == 0){
            printf("Server terminated.\n");
            return;
        }
        recvline[num] = '\0';
        printf("Server Message: %s\n", recvline);
    }

    printf("\nExit.\n");
}

char* getMessage(char* sendline, int len, FILE* fp){
    printf("Input string to server:");
    return (fgets(sendline, MAXDATASIZE, fp));
}